unit da_core;

{$mode Delphi}

interface

uses
    Classes, SysUtils, Graphics, ExtCtrls, da_point, da_triangle;

const
	DA_PNTS_M = 30;

type

	TDArea = class
	private
		da: TImage;
		da_pnts: array [1..DA_PNTS_M] of TDAPoint;
		da_pnts_c: Integer;
	public
		// Конструктор класса
		Constructor new(da_o: TImage);
		// Очистка области рисования
		procedure d_clear();
		// Отрисовка точки
		procedure d_point(pnt_o: TDAPoint; pnt_ro: Integer = 4; pnt_ri: Integer = 2);
		// Отрисовка треугольника
		procedure d_triangle(tr_o: TDATriangle);
		// Удаление точки по ее индексу
		procedure d_del_pnt(pnt_n: Integer);
		// Удаление всех точек
		procedure d_del_all();
		// Создание новой точки
		procedure d_add_pnt(pnt_o: TDAPoint);
		// Переотрисовка всех точек
		procedure d_redraw();
		// Конвертирование координат в Декартову систему
		procedure d_pnt_dconv(var pnt_o: TDAPoint);
		// Получение точки по ее индексу
		function g_pnt_n(pnt_n: Integer): TDAPoint;
		// Получение количества точек области рисования
		function g_pnts_cnt() :Integer;
		// Получение максимального количества точек области рисования
		function g_pnts_cnt_m() :Integer;
		// Проверка видимости точки
		function g_pnt_vis(pnt_o: TDAPoint) :Boolean;
	end;

implementation

// Конструктор класса
Constructor TDArea.new(da_o: TImage);
begin
	da := da_o;
	da_pnts_c := 0;
end;

// Очистка области рисования
procedure TDArea.d_clear();
begin
	with da.Canvas do
	begin
		Pen.Color := clGray;
		Brush.Color := clWhite;
		Rectangle(0, 0, da.Width, da.Height);
	end;
end;

// Отрисовка точки
procedure TDArea.d_point(pnt_o: TDAPoint; pnt_ro: Integer = 4; pnt_ri: Integer = 2);
begin
	with da.Canvas do
	begin
		// Внешняя окружность
		Pen.Color := clBlue;
		Brush.Color := clWhite;
		Ellipse(pnt_o.get_dcoord.X - pnt_ro, pnt_o.get_dcoord.Y - pnt_ro, 
				pnt_o.get_dcoord.X + pnt_ro, pnt_o.get_dcoord.Y + pnt_ro);
		// Внутренняя окружность
		Brush.Color := clGreen;
		Ellipse(pnt_o.get_dcoord.X - pnt_ri, pnt_o.get_dcoord.Y - pnt_ri, 
				pnt_o.get_dcoord.X + pnt_ri, pnt_o.get_dcoord.Y + pnt_ri);
	end;
end;

// Отрисовка треугольника
procedure TDArea.d_triangle(tr_o: TDATriangle);
begin
	with da.Canvas do
	begin
		Pen.Color := clBlue;
		MoveTo(tr_o.get_head_f.get_dcoord);
		LineTo(tr_o.get_head_s.get_dcoord);
		LineTo(tr_o.get_head_t.get_dcoord);
		LineTo(tr_o.get_head_f.get_dcoord);
	end;
end;

// Удаление точки по ее индексу
procedure TDArea.d_del_pnt(pnt_n: Integer);
begin
	da_pnts[pnt_n] := da_pnts[da_pnts_c];
	Dec(da_pnts_c);
end;

// Удаление всех точек
procedure TDArea.d_del_all();
begin
	da_pnts_c := 0;
	d_clear();
end;

// Создание новой точки
procedure TDArea.d_add_pnt(pnt_o: TDAPoint);
begin	
	// Добавление точки в массив
	Inc(da_pnts_c);
	da_pnts[da_pnts_c] := pnt_o;
	
	// Отрисовка точки
	if g_pnt_vis(pnt_o) then
		d_point(pnt_o);
end;

// Переотрисовка всех точек
procedure TDArea.d_redraw();
var
	I: Integer;
begin
	if (da_pnts_c > 0) then
	begin
		d_clear();
		for I := 1 to da_pnts_c do
			d_point(da_pnts[I]);
	end;
end;

// Конвертирование координат в Декартову систему
procedure TDArea.d_pnt_dconv(var pnt_o: TDAPoint);
begin
	pnt_o := TDAPoint.new(pnt_o.get_rcoord.X,
						  da.Height - pnt_o.get_rcoord.Y);
end;

// Получение точки по ее индексу
function TDArea.g_pnt_n(pnt_n: Integer): TDAPoint;
begin
	g_pnt_n := da_pnts[pnt_n];
end;

// Получение количества точек области рисования
function TDArea.g_pnts_cnt() :Integer;
begin
	g_pnts_cnt := da_pnts_c;
end;

// Получение максимального количества точек области рисования
function TDArea.g_pnts_cnt_m() :Integer;
begin
	g_pnts_cnt_m := DA_PNTS_M;
end;

// Проверка видимости точки
function TDArea.g_pnt_vis(pnt_o: TDAPoint) :Boolean;
begin
	g_pnt_vis := ((pnt_o.get_dcoord.X >= 0) and (pnt_o.get_dcoord.X <= da.Width)) and 
				 ((pnt_o.get_dcoord.Y >= 0) and (pnt_o.get_dcoord.Y <= da.Height)); 
end;

end.

